<!DOCTYPE html>
<html lang="zh-cn">
  <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="Zhou Wei <zromyk@163.com>">
  <title>STL</title>
  <link rel="shortcut icon" href="/favicon.ico">
  <link rel="stylesheet" href="/style/html/pure.css">
  <link rel="stylesheet" href="/style/html/main.css">
  <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.css">
  <!-- <link rel="stylesheet" href="https://apps.bdimg.com/libs/highlight.js/9.1.0/styles/default.min.css"> -->
<link rel="stylesheet" href="/style/article/highlight/default.min.css">
<link rel="stylesheet" href="/style/article/pell-1.0.6/dist/pell.css">

</head>
<body>
  <div id="menu-background"></div>
  <div id="menu">
    <div class="pure-menu pure-menu-horizontal">
  <ul class="pure-menu-list block-middle">
    <li class="pure-menu-item">
  <a class="pure-menu-heading" href="/index.html">ZROMYK</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/index.html">主页</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/archive/index.html">归档</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/download/index.html">下载</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/feedback/index.html">反馈</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/about/index.html">关于我</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="https://github.com/zromyk"><i class="fa fa-github" style="font-size:32px"></i></a>
</li>

  </ul>
</div>

  </div>
  <div id="layout">
    <div class="content">
      <div id="nav">
    <div id="navigation" class="navigation">
  <ul class="pure-menu-list">
    <li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#1-vector">1. vector（向量）</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#vector">vector遍历</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#vector_1">vector插入</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#vector_2">vector删除</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#2deque">2.deque</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#3-queue">3. queue（队列）</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#4-stack">4. stack（栈）</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#5-list">5. list（双向链表）</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#insert">insert()成员方法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#splice">splice()成员方法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#list">list删除</a>
</li>

  </ul>
</div>

</div>
<div id="content-articles">
  <h1 id="STL" class="content-subhead">STL</h1>
  <p>
    <span>2020-10-17</span>
    <span><span class="post-category post-category-algorithm">Algorithm</span></span>
    <button id="button-markdownEditor" class="pure-button" onclick="markdownEditor()">启用编辑</button>
    <button id="button-save" class="pure-button" onclick="save()">保存</button>
  </p>
  <div id="content-articles-markdownEditor" style="display: none;">
    <h1>编辑 power by pell</h1>
    <div id="editor" class="pell"></div>
    <div style="margin-top:20px;">
        <h3>Text output:</h3>
        <div id="text-output"></div>
    </div>
    <div style="margin-top:20px;">
        <h3>HTML output:</h3>
        <pre id="html-output"></pre>
    </div>
  </div>
  <div id="content-articles-markdown">
    <h2 id="1-vector">1. vector（向量）</h2>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>函数成员</th>
<th>函数功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>begin()</td>
<td>返回指向容器中第1个元素的<strong>迭代器</strong>。</td>
</tr>
<tr>
<td>end()</td>
<td>返回指向容器最后1个元素所在位置后1个位置的<strong>迭代器</strong>，通常和 begin() 结合使用。</td>
</tr>
<tr>
<td>rbegin()</td>
<td>（反向迭代器）返回指向最后1个元素的迭代器。</td>
</tr>
<tr>
<td>rend()</td>
<td>（反向迭代器）返回指向第1个元素所在位置前1个位置的迭代器。</td>
</tr>
<tr>
<td><strong>cbegin()</strong></td>
<td>和 begin() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td><strong>cend()</strong></td>
<td>和 end() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td>crbegin()</td>
<td>（反向迭代器）和 rbegin() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td>crend()</td>
<td>（反向迭代器）和 rend() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td>size()</td>
<td>返回实际元素个数。</td>
</tr>
<tr>
<td>max_size()</td>
<td>返回元素个数的最大值。这通常是1个很大的值，一般是 <script type="math/tex">2^{32}-1</script>，所以我们很少会用到这个函数。</td>
</tr>
<tr>
<td>resize()</td>
<td>改变实际元素的个数。</td>
</tr>
<tr>
<td>capacity()</td>
<td>返回当前容量。</td>
</tr>
<tr>
<td>empty()</td>
<td>判断容器中是否有元素，若无元素，则返回 true；反之，返回 false。</td>
</tr>
<tr>
<td><strong>reserve()</strong></td>
<td><strong>增加容器的容量。</strong></td>
</tr>
<tr>
<td><strong>shrink <em>to</em>fit()</strong></td>
<td><strong>将内存减少到等于当前元素实际所使用的大小。</strong></td>
</tr>
<tr>
<td>operator[ ]</td>
<td>重载了 [ ] 运算符，可以向访问数组中元素那样，通过下标即可访问甚至修改 vector 容器中的元素。</td>
</tr>
<tr>
<td><strong>at()</strong></td>
<td><strong>使用经过边界检查的索引访问元素。</strong></td>
</tr>
<tr>
<td>front()</td>
<td>返回第1个元素的引用。</td>
</tr>
<tr>
<td>back()</td>
<td>返回最后1个元素的引用。</td>
</tr>
<tr>
<td><strong>data()</strong></td>
<td>返回指向容器中<strong>第1个元素的指针</strong>。</td>
</tr>
<tr>
<td>assign()</td>
<td>用新元素替换原有内容。</td>
</tr>
<tr>
<td>~~push_back()~~</td>
<td>~~在序列的尾部添加1个元素。（需要先构造临时对象，再将这个对象拷贝到容器的末尾）~~</td>
</tr>
<tr>
<td>pop_back()</td>
<td>移出序列尾部的元素。</td>
</tr>
<tr>
<td>insert()</td>
<td>在指定的位置插入<strong>1个</strong>或<strong>多个</strong>元素。<strong>(可以插入多个元素)</strong></td>
</tr>
<tr>
<td><strong>erase()</strong></td>
<td>移出<strong>1个元素</strong>或<strong>1段元素</strong>。</td>
</tr>
<tr>
<td>clear()</td>
<td>移出所有的元素，容器大小变为 0。</td>
</tr>
<tr>
<td>swap()</td>
<td>交换两个容器的所有元素。</td>
</tr>
<tr>
<td><strong>emplace()</strong></td>
<td><strong>（C++11）</strong>在指定的位置直接生成<strong>1</strong>个元素。<strong>（只能插入1个元素）</strong></td>
</tr>
<tr>
<td><strong>emplace_back()</strong></td>
<td><strong>（C++11）</strong>在序列尾部生成<strong>1</strong>个元素。（直接在容器的末尾构造对象，这样就省去了拷贝的过程）</td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p>注意：</p>
<ol>
<li>在初始化空的 vector 容器时，不能使用迭代器，对于空的 vector 容器来说，begin() 和 end() 成员函数返回的迭代器是相等的，即它们指向的是同1个位置。</li>
<li>vector 容器在申请更多内存的同时，容器中的所有元素可能会被复制或移动到新的内存地址，这会导致之前创建的迭代器失效。</li>
</ol>
</blockquote>
<h3 id="vector">vector遍历</h3>
<ol>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>容器名[n]</code></span>这种获取元素的方式，需要确保下标 n 的值不会超过容器的容量（可以通过 capacity() 成员函数获取），否则会发生越界访问的错误。幸运的是，和 array 容器一样，vector 容器也提供了 at() 成员函数，当传给 at() 的索引会造成越界时，会抛出<span style="overflow-x: auto; max-width:100%; display:inline;"><code>std::out_of_range</code></span>异常。</li>
</ol>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c">// vector[]、vector.at()
for (int i = 0; i &lt; values.size(); i++) {
     cout &lt;&lt; values[i] &lt;&lt; &quot; &quot;;
     // cout &lt;&lt; vector.at(i) &lt;&lt; &quot; &quot;;
}
</code></span></code></pre>
<ol start="2">
<li>vector 容器还提供了 2 个成员函数，即 front() 和 back()，它们分别返回 vector 容器中第1个和最后1个元素的引用，通过利用这 2 个函数返回的引用，可以访问（甚至修改）容器中的首尾元素。</li>
</ol>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c">vector.front()
vector.back()
</code></span></code></pre>
<ol start="3">
<li>vector 容器还提供了 data() 成员函数，该函数的功能是返回指向容器中首个元素的指针。通过该指针也可以访问甚至修改容器中的元素。</li>
</ol>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c">// vector.data() // 返回vector数据的首地址
for (int i = 0; i &lt; values.size(); i++) {
     cout &lt;&lt; vector.data() + i &lt;&lt; &quot; &quot;;
}
</code></span></code></pre>
<ol start="4">
<li>迭代器</li>
</ol>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c">for (auto node = values.begin(); node &lt; values.end(); ++node) {
    cout &lt;&lt; *node &lt;&lt; &quot; &quot;;
}
</code></span></code></pre>
<h3 id="vector_1">vector插入</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>语法格式</th>
<th>用法说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>iterator insert(pos,elem)</td>
<td>在迭代器 pos 指定的位置之前插入1个新元素elem，并返回表示新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,n,elem)</td>
<td>在迭代器 pos 指定的位置之前插入 n 个元素 elem，并返回表示第1个新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,first,last)</td>
<td>在迭代器 pos 指定的位置之前，插入其他容器<strong>（不仅限于vector）</strong>中位于 [first,last) 区域的所有元素，并返回表示第1个新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,initlist)</td>
<td>在迭代器 pos 指定的位置之前，<strong>插入初始化列表</strong>（用大括号{}括起来的多个元素，中间有逗号隔开）中所有的元素，并返回表示第1个新插入元素位置的迭代器。</td>
</tr>
<tr>
<td><strong>iterator emplace (const_iterator pos, args&hellip;);</strong></td>
<td><strong>（C++11 ）在 vector 容器指定位置之前插入1个新的元素。</strong></td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p>再次强调，emplace() 每次只能插入1个元素，而不是多个。</p>
</blockquote>
<h3 id="vector_2">vector删除</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>函数</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>pop_back()</td>
<td>删除 vector 容器中最后1个元素，该容器的大小（size）会减 1，但容量（capacity）不会发生改变。</td>
</tr>
<tr>
<td>iterator erase(pos)</td>
<td>删除 vector 容器中 pos 迭代器指定位置处的元素，<strong>并返回指向被删除元素下1个位置元素的迭代器</strong>。该容器的大小（size）会减 1，但容量（capacity）不会发生改变。</td>
</tr>
<tr>
<td>swap(beg)、pop_back()</td>
<td>先调用 swap() 函数交换要删除的目标元素和容器最后1个元素的位置，然后使用 pop_back() 删除该目标元素。</td>
</tr>
<tr>
<td>iterator erase(beg,end)</td>
<td>删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素，并返回指向被删除区域下1个位置元素的迭代器。该容器的大小（size）会减小，但容量（capacity）不会发生改变。</td>
</tr>
<tr>
<td>remove()</td>
<td>删除容器中所有和指定元素值相等的元素，并返回指向最后1个元素下1个位置的迭代器。值得一提的是，<strong>调用该函数不会改变容器的大小（size）和容量（capacity）。</strong></td>
</tr>
<tr>
<td>clear()</td>
<td>删除 vector 容器中所有的元素，使其变成空的 vector 容器。<strong>该函数会改变 vector 的大小（变为 0）</strong>，但不是改变其容量。</td>
</tr>
</tbody>
</table></div>
<h2 id="2deque">2.deque</h2>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>成员函数</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>~~push_back()~~</td>
<td>~~在容器现有元素的尾部添加1个元素，和 emplace_back() 不同，该函数添加新元素的过程是，先构造元素，然后再将该元素移动或复制到容器的尾部。~~</td>
</tr>
<tr>
<td>pop_back()</td>
<td>移除容器尾部的1个元素。</td>
</tr>
<tr>
<td>~~push_front()~~</td>
<td>~~在容器现有元素的头部添加1个元素，和 emplace_back() 不同，该函数添加新元素的过程是，先构造元素，然后再将该元素移动或复制到容器的头部。~~</td>
</tr>
<tr>
<td>pop_front()</td>
<td>移除容器尾部的1个元素。</td>
</tr>
<tr>
<td><strong>emplace_back()</strong></td>
<td><strong>（C++11）</strong>在容器尾部生成1个元素。和 push_back() 不同，该函数直接在容器头部构造元素，省去了复制或移动元素的过程。</td>
</tr>
<tr>
<td><strong>emplace_front()</strong></td>
<td><strong>（C++11）</strong>在容器头部生成1个元素。和 push_front() 不同，该函数直接在容器头部构造元素，省去了复制或移动元素的过程。</td>
</tr>
<tr>
<td>insert()</td>
<td>在指定的位置直接生成1个元素。和 emplace() 不同的是，该函数添加新元素的过程是，先构造元素，然后再将该元素移动或复制到容器的指定位置。</td>
</tr>
<tr>
<td><strong>emplace()</strong></td>
<td><strong>（C++11）</strong>指定的位置直接生成1个元素。和 insert() 不同的是，emplace() 直接在容器指定位置构造元素，省去了复制或移动元素的过程。</td>
</tr>
<tr>
<td>erase()</td>
<td>移除1个元素或某一区域内的多个元素。</td>
</tr>
<tr>
<td>clear()</td>
<td>删除容器中所有的元素。</td>
</tr>
</tbody>
</table></div>
<p><strong>deque与vector的主要不同之处在于：</strong></p>
<ol>
<li>两端都能快速安插和删除元素，这些操作可以在分期摊还的常数时间（amortized constant time）内完成。</li>
<li>因为deque使用不止一块内存（而vector必须使用一块连续内存），所以deque的max_size()可能更大。</li>
<li>不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector，因为其内部结构显示，deque不必在内存重分配时复制所有元素。</li>
</ol>
<blockquote class="content-quote">
<p>c++标准建议：vector是那种应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时，应该选用deque。</p>
</blockquote>
<p><strong>注意：任何插入或删除动作都会使所有指向deque元素的pointers、references、iteartors失效，唯一例外的是在头部或尾部插入元素（此时pointers和references仍然有效，但iterators失效）。</strong></p>
<h2 id="3-queue">3. queue（队列）</h2>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>函数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>push(x)</td>
<td>将x压入队列的末端</td>
</tr>
<tr>
<td>pop()</td>
<td>弹出队列的第1个元素(队顶元素)，<strong>注意此函数并不返回任何值</strong></td>
</tr>
<tr>
<td>front()</td>
<td>返回第1个元素(队顶元素)</td>
</tr>
<tr>
<td>back()</td>
<td>返回最后被压入的元素(队尾元素)</td>
</tr>
<tr>
<td>empty()</td>
<td>当队列为空时，返回true</td>
</tr>
<tr>
<td>size()</td>
<td>返回队列的长度</td>
</tr>
</tbody>
</table></div>
<h2 id="4-stack">4. stack（栈）</h2>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>函数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>push(x)</td>
<td>将x加入栈中，即入栈操作</td>
</tr>
<tr>
<td>pop()</td>
<td>出栈操作(删除栈顶)，<strong>注意此函数并不返回任何值</strong></td>
</tr>
<tr>
<td>top()</td>
<td>返回第1个元素(栈顶元素)</td>
</tr>
<tr>
<td>empty()</td>
<td>当栈为空时，返回 true</td>
</tr>
<tr>
<td>size()</td>
<td>返回栈中的元素个数</td>
</tr>
</tbody>
</table></div>
<h2 id="5-list">5. list（双向链表）</h2>
<p>list 容器中各个元素的前后顺序是靠指针来维系的，每个元素都配备了 2 个指针，分别指向它的前一个元素和后一个元素。其中第一个元素的前向指针总为 null，因为它前面没有元素；同样，尾部元素的后向指针也总为 null。</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>成员函数</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>begin()</td>
<td>返回指向容器中第一个元素的双向迭代器。</td>
</tr>
<tr>
<td>end()</td>
<td>返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。</td>
</tr>
<tr>
<td>rbegin()</td>
<td>返回指向最后一个元素的反向双向迭代器。</td>
</tr>
<tr>
<td>rend()</td>
<td>返回指向第一个元素所在位置前一个位置的反向双向迭代器。</td>
</tr>
<tr>
<td><strong>cbegin()</strong></td>
<td><strong>和 begin() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</strong></td>
</tr>
<tr>
<td><strong>cend()</strong></td>
<td><strong>和 end() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</strong></td>
</tr>
<tr>
<td>crbegin()</td>
<td>和 rbegin() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td>crend()</td>
<td>和 rend() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。</td>
</tr>
<tr>
<td>empty()</td>
<td>判断容器中是否有元素，若无元素，则返回 true；反之，返回 false。</td>
</tr>
<tr>
<td>size()</td>
<td>返回当前容器实际包含的元素个数。</td>
</tr>
<tr>
<td>max_size()</td>
<td>返回容器所能包含元素个数的最大值。这通常是一个很大的值，一般是 232-1，所以我们很少会用到这个函数。</td>
</tr>
<tr>
<td>front()</td>
<td>返回第一个元素的引用。</td>
</tr>
<tr>
<td>back()</td>
<td>返回最后一个元素的引用。</td>
</tr>
<tr>
<td>assign()</td>
<td>用新元素替换容器中原有内容。</td>
</tr>
<tr>
<td><strong>emplace_front()</strong></td>
<td><strong>（C++11）在容器头部生成一个元素。</strong>该函数和 push_front() 的功能相同，但效率更高。</td>
</tr>
<tr>
<td>~~push_front()~~</td>
<td>~~在容器头部插入一个元素。~~</td>
</tr>
<tr>
<td>pop_front()</td>
<td>删除容器头部的一个元素。</td>
</tr>
<tr>
<td><strong>emplace_back()</strong></td>
<td><strong>（C++11）在容器尾部直接生成一个元素。</strong>该函数和 push_back() 的功能相同，但效率更高。</td>
</tr>
<tr>
<td>~~push_back()~~</td>
<td>~~在容器尾部插入一个元素。~~</td>
</tr>
<tr>
<td>pop_back()</td>
<td>删除容器尾部的一个元素。</td>
</tr>
<tr>
<td><strong>emplace()</strong></td>
<td><strong>（C++11）在容器中的指定位置插入元素。</strong>该函数和 insert() 功能相同，但效率更高。</td>
</tr>
<tr>
<td>insert()</td>
<td>在容器中的指定位置插入元素。</td>
</tr>
<tr>
<td>erase()</td>
<td>删除容器中一个或某区域内的元素。</td>
</tr>
<tr>
<td>swap()</td>
<td>交换两个容器中的元素，必须保证这两个容器中存储的元素类型是相同的。</td>
</tr>
<tr>
<td>resize()</td>
<td>调整容器的大小。</td>
</tr>
<tr>
<td>clear()</td>
<td>删除容器存储的所有元素。</td>
</tr>
<tr>
<td><strong>splice()</strong></td>
<td><strong>将一个 list 容器中的元素插入到另一个容器的指定位置。</strong></td>
</tr>
<tr>
<td>remove(val)</td>
<td>删除容器中所有等于 val 的元素。</td>
</tr>
<tr>
<td>remove_if()</td>
<td>删除容器中满足条件的元素。</td>
</tr>
<tr>
<td>unique()</td>
<td>删除容器中相邻的重复元素，只保留一个。</td>
</tr>
<tr>
<td>merge()</td>
<td>合并两个事先已排好序的 list 容器，并且合并之后的 list 容器依然是有序的。</td>
</tr>
<tr>
<td>sort()</td>
<td>通过更改容器中元素的位置，将它们进行排序。</td>
</tr>
<tr>
<td>reverse()</td>
<td>反转容器中元素的顺序。</td>
</tr>
</tbody>
</table></div>
<h3 id="insert">insert()成员方法</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>语法格式</th>
<th>用法说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>iterator insert(pos,elem)</td>
<td>在迭代器 pos 指定的位置之前插入一个新元素 elem，并返回表示新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,n,elem)</td>
<td>在迭代器 pos 指定的位置之前插入 n 个元素 elem，并返回表示第一个新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,first,last)</td>
<td>在迭代器 pos 指定的位置之前，插入其他容器（例如 array、vector、deque 等）中位于 [first,last) 区域的所有元素，并返回表示第一个新插入元素位置的迭代器。</td>
</tr>
<tr>
<td>iterator insert(pos,initlist)</td>
<td>在迭代器 pos 指定的位置之前，插入初始化列表（用大括号 { } 括起来的多个元素，中间有逗号隔开）中所有的元素，并返回表示第一个新插入元素位置的迭代器。</td>
</tr>
</tbody>
</table></div>
<h3 id="splice">splice()成员方法</h3>
<p>和 insert() 成员方法相比，splice() 成员方法的作用对象是其它 list 容器，其功能是将其它 list 容器中的元素添加到当前 list 容器中指定位置处。splice() 成员方法的语法格式有 3 种。</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>语法格式</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>void splice (iterator position, list&amp; x);</td>
<td>position 为迭代器，用于指明插入位置；x 为另一个 list 容器。 此格式的 splice() 方法的功能是，将 x 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。</td>
</tr>
<tr>
<td>void splice (iterator position, list&amp; x, iterator i);</td>
<td>position 为迭代器，用于指明插入位置；x 为另一个 list 容器；i 也是一个迭代器，用于指向 x 容器中某个元素。 此格式的 splice() 方法的功能是将 x 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。</td>
</tr>
<tr>
<td>void splice (iterator position, list&amp; x, iterator first, iterator last);</td>
<td>position 为迭代器，用于指明插入位置；x 为另一个 list 容器；first 和 last 都是迭代器，[fist,last) 用于指定 x 容器中的某个区域。 此格式的 splice() 方法的功能是将 x 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。</td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p>list 容器底层使用的是链表存储结构，splice() 成员方法移动元素的方式是，将存储该元素的节点从 list 容器底层的链表中摘除，然后再链接到当前 list 容器底层的链表中。这意味着，当使用 splice() 成员方法将 x 容器中的元素添加到当前容器的同时，该元素会从 x 容器中删除。</p>
</blockquote>
<h3 id="list">list删除</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>成员函数</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>pop_front()</td>
<td>删除位于 list 容器头部的一个元素。</td>
</tr>
<tr>
<td>pop_back()</td>
<td>删除位于 list 容器尾部的一个元素。</td>
</tr>
<tr>
<td>erase()</td>
<td>该成员函数既可以删除 list 容器中指定位置处的元素，也可以删除容器中某个区域内的多个元素。</td>
</tr>
<tr>
<td>clear()</td>
<td>删除 list 容器存储的所有元素。</td>
</tr>
<tr>
<td>remove(val)</td>
<td>删除容器中所有等于 val 的元素。</td>
</tr>
<tr>
<td>unique()</td>
<td>删除容器中相邻的重复元素，只保留一份。</td>
</tr>
<tr>
<td>remove_if()</td>
<td>删除容器中满足条件的元素。</td>
</tr>
</tbody>
</table></div>
  </div>
</div>
 
    </div>
  </div>
  <div id="footer-background">
    <div id="footer">
      <div class="legal pure-g">
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-license"><a href="https://beian.miit.gov.cn/#/Integrated/index">浙ICP备2020038748号</a></p>
  </div>
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-links"><a href="https://github.com/zromyk">GitHub</a></p>
    <p class="legal-copyright">Copyright © 2021 Wei Zhou. 保留所有权利。</p>
  </div>
</div>
    </div>
  </div>
  <!-- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> -->
  <script src="/style/html/jquery.min.js"></script>
  <script src='/style/article/latex/latest.js?config=TeX-MML-AM_CHTML'></script>
<!-- <script src="https://cdn.geogebra.org/apps/deployggb.js"></script> -->
<script src="/style/article/deployggb.js"></script>
<!-- <script src="https://apps.bdimg.com/libs/highlight.js/9.1.0/highlight.min.js"></script> -->
<script type="text/javascript">
  // 脚本：navigation 随鼠标移动自动变换宽度
  var element = document.getElementById("navigation"); // 获取要操作的元素
  var elementWidth = parseInt(getComputedStyle(element).width);
  var elementLeft = 0;
  var elementRight = 0;
  element.addEventListener('mouseenter', function (event) { // 添加鼠标按下事件的监听器
    elementLeft = element.getBoundingClientRect().left - 10;
    elementRight = element.getBoundingClientRect().left + elementWidth * 3;
    window.addEventListener('mousemove', resize); // 添加全局的鼠标移动事件的监听器
  });

  function resize(event) {
    var minWidth = elementWidth;
    var maxWidth = elementWidth * 2.5;
    // console.log(elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    if (elementLeft <= event.clientX && event.clientX <= elementRight) {
      var width = event.clientX - elementLeft + elementWidth / 2;
      width = Math.min(width, maxWidth);
      width = Math.max(width, minWidth);
      element.style.width = width + 'px'; // 设置新的宽度样式属性
    }
    else {
      element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
      stopResize();
    }
  }

  function stopResize() {
    element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
    // console.log("stopResize", elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    window.removeEventListener('mousemove', resize); // 移除鼠标移动事件的监听器
  }
</script>
<script src="/style/article/highlight/highlight.min.js"></script>
<script type="text/javascript">
  // 脚本：code语法高亮
  hljs.initHighlightingOnLoad();
</script>
<script>
  function animateByNav() {
    $("html").animate({
        scrollTop: ($(event.target.hash).offset().top - 52)
    }, 300);
  };
</script>
<script src="/style/article/pell-1.0.6/dist/pell.js"></script>
<script>
  // 脚本：自由编辑页面
  var editor = window.pell.init({
    element: document.getElementById('editor'),
    defaultParagraphSeparator: 'p',
    onChange: function(html) {
        document.getElementById('text-output').innerHTML = html
        document.getElementById('html-output').textContent = html
    }
  });

  function markdownEditor() {
    var articles = document.getElementById('content-articles-markdown');
    if (articles.getAttribute("contenteditable") == "true") {
        articles.setAttribute("contenteditable", "false");
        document.getElementById("content-articles-markdownEditor").style.display = "none"; //隐藏
        document.getElementById("button-markdownEditor").innerHTML = "启用编辑";
    } else {
        articles.setAttribute("contenteditable", "true");
        document.getElementById("content-articles-markdownEditor").style.display = ""; //显示
        document.getElementById("button-markdownEditor").innerHTML = "关闭编辑";
    }
  };

  function save() {
      window.alert("保存成功");
  };
</script>

</body>
</html>
